package com.humngyang.com.hmy.study.springtest.mybatis;

import java.lang.reflect.Proxy;

public class MybatisProxy {
    /**
     * 一：mybitis的原理：通过jdk的动态代理为mapper接口产生一个代理对象，-----所有的方法，都是完成数据库的访问。
     * *    自己实现一个mybatis的步骤
     * *    1：数据库连接
     * *    2：执行数据库
     * *    3：得到sql
     * *    4：实现代理对象。
     * 二：代理对象如何管理
     *      代理对象如何交给spring管理 ---- 自己产生的对象如何交给spring管理。；例如SqlSessionFactory，DataSource等等
     *          1：使用@Bean
     *      Spring是如何将一个类变成一个bean的。
     *          @Bean和@Component的区别
     *              @Bean可以定制自己的对象，可以产生代理，可以new别的对象
     *              @Component是将一个类new一个对象，然后放入容器当中去。是不能定制自己的对象的
     **/
    public static void main(String[] args) {
        /**
         *  ClassLoader loader      : 当前类的classloder
         *  Class<?>[] interfaces   : 通过产生的代理对象，要实现哪个接口，要实现的接口可以是一个数组
         *  InvocationHandler       : 通过代理返回的对象，这个对象要实现userDao的接口，如果要实现userDao的接口
         *                             就得实现userDao的所有方法，这其中的方法就是要得到sql语句，并执行sql语句
         *                             ，这个步骤的实现需要实现InvocationHandler接口的实现类
         **/
        Class[] clazzs = new Class[]{UserDao.class};
        UserDao o = (UserDao) Proxy.newProxyInstance(MybatisProxy.class.getClassLoader(),
                clazzs,
                new HmyInvocationHandler());
        o.queryAll();
        o.queryById("1");
    }
}
